iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 26

Day 26 - 測試的基礎:Unit Test

  • 分享至 

  • xImage
  •  

今天很需要來首 Upside Down
Yes

單元測試 (Unit Testing)

單元測試是一種軟體測試方法,是指在開發過程中測試特定的程式碼 unit 或系統中的個別部分,以確保正確性。一個「單元 unit」是系統中所謂的最小可測試部分(通常是一個函數或方法),在多數情況下有一個明確定義的行為。

為什麼單元測試重要?

  • 提早發現問題:單元測試可以在開發早期就發現問題,而不是在最後的整合測試或 go prod 才發現。
  • 改進設計:撰寫測試的過程中通常會揭露設計缺陷與其他問題。
  • 降低維護成本:修改程式碼或重構時,單元測試可以快速檢視重構後是否與既有的功能一致。

Spring Boot Test Starter

在Java中,我們通常使用 JUnit 框架來進行單元測試。而 Spring Boot Test Starter 是 Spring Boot 一個用來進行測試的 dependency。他把多個測試用的依賴整合到一個 Starter POM 中方便開發者使用。包含了 JUnit(依據使用 Spring Boot 版本不同有不同版本的 JUnit)、Spring Test、Mockito 等。

如何使用 Spring Boot Test Starter?

要使用 Spring Boot Test Starter 需要在 pom.xmlbuild.gradle 中加入以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
testImplementation 'org.springframework.boot:spring-boot-starter-test'
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class ApplicationTest {
    @Autowired
    private Calculator calculator;

    @Test
    public void testAddition() {
        int result = calculator.add(2, 3);
        assertThat(result).isEqualTo(5);
    }
}

@Component
class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

在這個例子中:

  • 使用 @SpringBootTest 註解來告訴 Spring Boot 載入整個應用上下文,這個過程會創建相關的 Beans 並自動配置。
  • 使用 @Autowired 來注入 Calculator Bean。
  • 使用 @Test 註解來標記一個測試方法,注意 JUnit 4 與 5 import 的 package 不同。
  • assertEquals 斷言,用來確保測試結果與期望值相符。
  • Calculator 類別包含我們想要測試的方法 add

測試的顆粒度

單元測試應該專注於小的功能點。每個測試應該只檢查「單個」功能或行為。當注意到撰寫測試變困難時,往往是重新檢視和調整程式碼的契機。

  1. 模組分解:單元測試覆蓋太多功能可能意味著被測試的函數或方法承擔過多責任,可以思考是否能拆分成多個單一職責的模組或函數。

  2. 依賴隔離:單元測試應該盡可能地去測試「單元」,如果程式碼與外部資源(例如資料庫或 Api )有過多的往來,可以考慮使用 Mock 或 Stub 來區隔這些依賴。

  3. 測試明確性:測試案例應該容易理解和維護。如果一個 test case 涵蓋過多情境或結構複雜,會變得難以理解和維護,因此確保測試目的和檢查點清楚明瞭是很重要的事情。

  4. 程式碼可測試性:如果測試難以撰寫,可能要思考如何改進程式碼的可測試性,例如通過依賴注入減少耦合,或酌用設計模式來改進程式碼結構。


上一篇
Day 25 - Testing in Spring Boot
下一篇
Day 27 - 進階:Integration Test
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言